Technical Q&A QA1227
Why does my identity matrix look strange?


Q: QuickTime ÇÃíPà çsóÒÇ™ä‘à·Ç¡ÇƒÇ¢ÇÈÇÊǧDžå©Ç¶ÇÈÇÃÇÕÇ»Ç∫Ç©Çí≤Ç◊ÇÊǧÇΔǵǃǢNjÇ∑ÅBQuickTime ÇÃíPà çsóÒÇÕéüÇÃÇÊǧDžǻÇÈÇÕÇ∏ÇæÇΔévÇÌÇÍÇ‹Ç∑ÅB

1 0 0
0 1 0
0 0 1

ǵǩǵÅASetIdentityMaxtix ÇégópǵǃçÏê¨Ç∑ÇÈÇΔÇ´Ç…ÇÕïKÇ∏ÅAà»â∫ÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

1 0 0
0 1 0
    0 0 16384

âΩÇ©ä‘à·Ç¡ÇΩDZÇΔÇǵǃǢÇÈÇÃÇ≈ǵÇÂǧǩÅH16384 ÇΔǢǧêîéöÇÕâΩÇà”ñ°Ç∑ÇÈÇÃÇ≈ǵÇÂǧǩÅH

A: MatrixRecord ÇÕ Fixed ílÇà 3 Å~ 3 ÇÃîzóÒÇΔǵǃêÈåæÇ≥ÇÍǃǢNjÇ∑Ç™ÅADZÇÃç\ë¢ëÃÇÃç≈å„ÇÃóÒÇÕÅAé¿ç€Ç…ÇÕ Fract ÇΔǵǃâéflÇ≥ÇÍǃǢNjÇ∑ÅBǵÇΩǙǡǃÅA16384 ÇΔǢǧêîéöÇÕÅAÇ‹Ç≥Ç… Fract Çà 1.0 Ç»ÇÃÇ≈Ç∑ÅB

Ç≥ÇÁÇ…è⁄ǵÇ≠å©ÇƒÇ¢Ç´Ç‹Ç∑ÅB

Fixed ÇÕ 16 ÉrÉbÉgÇÃïÑçÜïtÇ´êÆêîÇ… 16 ÉrÉbÉgÇÃóLóùêîÇë´ÇµÇΩLJÇÃÇ≈Ç∑ÅB
Fract ÇÕ 2 ÉrÉbÉgÇÃïÑçÜïtêÆêîÇ… 30 ÉrÉbÉgÇÃóLóùêîÇë´ÇµÇΩLJÇÃÇ≈Ç∑ÅB

typedef long Fixed;
typedef long Fract;
struct MatrixRecord {
     Fixed matrix[3][3];
};
typedef struct MatrixRecord MatrixRecord;

ê} 1 ÇÃäeÉZÉãÇÕÅA3 Å~ 3 çsóÒÇÃëŒâûÇ∑ÇÈóvëfÇÃÉfÅ[É^å^Çé¶ÇµÇƒÇ¢Ç‹Ç∑ÅBçsóÒÇÃç≈èâÇà 2 óÒÇÃóvëfÇÕ Fixed ílÇ≈ï\åªÇ≥ÇÍÇ‹Ç∑ÅB3 óÒñ⁄ÇÃóvëfÇÕÅAFixed ílÇΔêÈåæÇ≥ÇÍǃǢNjÇ∑Ç™ÅAì‡ïîìIÇ…ÇÕ Fract ílÇΔǵǃï\åªÇ≥ÇÍÇ‹Ç∑ÅBFract ÉfÅ[É^å^ÇÕÅA2 ÉrÉbÉgÇÃêÆêîÇΔ 30 ÉrÉbÉgÇÃóLóùêîÇä‹Çfi 32 ÉrÉbÉgÇÃå≈íËè¨êîì_ílÇéwíËǵNjÇ∑ÅB

[0][0]Fixed       [1][0]Fixed       [2][0]Fract
[0][1]Fixed       [1][1]Fixed       [2][1]Fract
[0][2]Fixed       [1][2]Fixed       [2][2]Fract

ê} 1. MatrixRecord

DZÇÃÇÊǧDžǻÇÈÇÃÇÕÅAç≈å„ÇÃóÒÇ≈îÒÉAÉtÉBÉìÅiâìãflñ@Åjïœä∑ÇíËã`ǵǃǢÇÈÇΩÇflÇ≈Ç∑ÅBDZÇÍÇÁÇÃïœä∑Ç…ÇÕÅAÇ≥ÇÁÇ…çÇÇ¢ê∏ìxÇ™óvãÅÇ≥ÇÍÇ‹Ç∑Ç™ÅAílÇÃîÕàÕÇÕǪÇÍÇŸÇ«ëÂÇ´Ç≠Ç∑ÇÈïKóvÇÕdžÇËÇ‹ÇπÇÒÅB

DZÇÃç≈å„ÇÃóÒÇÕÅAóvëfílÇΔìÆçÏÇÃä‘ÇÃÉ}ÉbÉsÉìÉOÇ™ï°éGÇ≈džÇÈÇΩÇflÅAìΔé©Ç…ê≥ǵÇ≠ê›íËÇ∑ÇÈÇÃÇÕã…Çflǃç¢ìÔÇ≈Ç∑ÅBQuickTime Ç™íÒãüÇ∑ÇÈ QuadToQuadMatrix API ÇÕÅAâìãflñ@çsóÒÇÃÉZÉbÉgÉAÉbÉvÇ…égópÇ≈Ç´ÇÈÇŸÇ©ÅADZÇÍÇégópǵǃdžÇÁljÇÈïœä∑ÅiägëÂèkè¨ÅAâÒì]ÅAljǙǛǻǫÅjLJä»íPÇ…çsǶNjÇ∑ÅB

OSErr QuadToQuadMatrix(const Fixed *source,
                       const Fixed *dest, MatrixRecord *map);

ê} 2. QuadToQuadMatrix API

DZÇÃåƒÇ—èoǵÇÕÅA4 ǬÇÃäJénì_ÇΔ 4 ǬÇÃç≈èIì_ÇéÊÇËÅADZÇÍÇÁÇÃì_ÇÃä‘ÇÉ}ÉbÉvÇ∑ÇÈçsóÒÇíËã`ǵNjÇ∑ÅB

à»â∫ÇÃó·ÇÕÅAQuadToQuadMatrix ÇégópǵǃçsóÒÇçÏê¨ÇµÅAÉXÉ^Å[ÉEÉHÅ[ÉYÉ^ÉCÉvÇÃÅuâìï˚Ç÷ÇÃÉXÉNÉçÅ[ÉãÅvå¯â Çé¿åªÇ∑ÇÈLJÇÃÇ≈Ç∑ÅBä÷êîÇÕíPèÉÇ…ÅAÉ\Å[ÉXÉ|ÉCÉìÉg (x, y)ÅAç∂è„ÅAâEè„ÅAâEâ∫ÅAç∂â∫Ç©ÇÁäJénǵNjÇ∑ÅBéüÇ…ÅAñ⁄ìIÇÃÉ|ÉCÉìÉgÇΔǵǃç∂è„Ç x ï˚å¸Ç…Å{20ÅAy ï˚å¸Ç…Å{40ÅAâEè„Ç x ï˚å¸Ç…Å|20ÅAy ï˚å¸Ç…Å{40ÅAâEâ∫ÅAç∂â∫Çê›íËǵNjÇ∑ÅB

void SetPerspectiveMatrix(Rect &inRect, MatrixRecord &outMatrix)
{
    FixedPoint source[4], dest[4];
    source[0].x = Long2Fix(inRect->left);
    source[0].y = Long2Fix(inRect->top);
    source[1].x = Long2Fix(inRect->right);
    source[1].y = Long2Fix(inRect->top);
    source[2].x = Long2Fix(inRect->right);
    source[2].y = Long2Fix(inRect->bottom);
    source[3].x = Long2Fix(inRect->left);
    source[3].y = Long2Fix(inRect->bottom);
    dest[0].x = Long2Fix(inRect->left + 20);
    dest[0].y = Long2Fix(inRect->top + 40);
    dest[1].x = Long2Fix(inRect->right - 20);
    dest[1].y = Long2Fix(inRect->top + 40);
    dest[2].x = Long2Fix(inRect->right);
    dest[2].y = Long2Fix(inRect->bottom);
    dest[3].x = Long2Fix(inRect->left);
    dest[3].y = Long2Fix(inRect->bottom);
    QuadToQuadMatrix((Fixed *)source, (Fixed *)dest, outMatrix);
}

ÉäÉXÉg 1. QuadToQuadMatrix ÇÃégópó·



[2002 îN 1 åé 3 ì˙]